# 反射
# 程序在运行过程中可以动态的获取对象的信息

class Foo:
    x = 12

    def __init__(self):
        self.x = 100
        self.age = 19


obj1 = Foo()
obj2 = 10
# 反射内置函数
# hasattr 判读对象或类是否拥有该属性
print(hasattr(obj1, 'x'))
print(hasattr(Foo, 'x'))
print(hasattr(obj2, 'x'))

# getattr 通过字符串调用对象属性
# 有返回值，没有会报错，可以指定没有时返回固定值
print(getattr(obj1, 'x'))
print(getattr(Foo, 'x'))
# print(getattr(obj2,'x'))
print(getattr(obj2, 'x', None))

# setattr 通过字符串给属性赋值
print(setattr(obj1, 'x', 3))
# print(setattr(obj2,'x',4)) 没有会报错

# delattr 删除属性
print(obj1.__dict__)
print(delattr(obj1, 'x'))
print(obj1.__dict__)
